///////////////////////////////////////////////////////////////////////////////////////////////////
/// \file formic/fqmc/configuration.h
///
/// \brief   header file for the Configuration and ConfigDiff classes
///
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef FORMIC_FQMC_CONFIGURATION_HEADER
#define FORMIC_FQMC_CONFIGURATION_HEADER

//#include<vector>
//#include<cassert>
//#include<string>
//
//namespace formic {
//
//  class InputBase;
//  class Configuration;
//
//  ///////////////////////////////////////////////////////////////////////////////////////////////////
//  /// \brief a class to hold information about the difference between two configurations
//  ///
//  ///////////////////////////////////////////////////////////////////////////////////////////////////
//  class ConfigDiff {
//
//    private:
//
//      /// \brief  sites in the fock vector that are empty in new but occupied in old
//      std::vector<int> _newly_empty;
//
//      /// \brief  sites in the fock vector that are occupied in new but empty in old
//      std::vector<int> _newly_full;
//
//    public:
//
//      std::vector<int> & newly_empty() { return _newly_empty; }
//      std::vector<int> & newly_full() { return _newly_full; }
//
//      const std::vector<int> & newly_empty() const { return _newly_empty; }
//      const std::vector<int> & newly_full() const { return _newly_full; }
//
//      ConfigDiff();
//
//      ConfigDiff(const formic::InputBase & userinp);
//
//      ConfigDiff(const formic::Configuration & new_config, const formic::Configuration & old_config);
//
//  };
//
//  ///////////////////////////////////////////////////////////////////////////////////////////////////
//  /// \brief  a class to hold a configuration
//  ///
//  ///////////////////////////////////////////////////////////////////////////////////////////////////
//  class Configuration {
//
//    private:
//
//      /// \brief  the number of alpha sites
//      int _nas;
//
//      /// \brief  the number of beta sites
//      int _nbs;
//
//      /// \brief  the number of alpha particles
//      int _nap;
//
//      /// \brief  the number of beta particles
//      int _nbp;
//
//      /// \brief  the number of alpha holes
//      int _nau;
//
//      /// \brief  the number of beta holes
//      int _nbu;
//
//      /// \brief  the configuration of the fock vector, in ababab... format
//      std::vector<int> _fock_config;
//
//      /// \brief  for each alpha site, the position of that site (if occupied) in the list of occupied sites
//      std::vector<int> _a_site_to_occ;
//
//      /// \brief  for each beta site, the position of that site (if occupied) in the list of occupied sites
//      std::vector<int> _b_site_to_occ;
//
//      /// \brief  for each alpha site, the position of that site (if unoccupied) in the list of unoccupied sites
//      std::vector<int> _a_site_to_unocc;
//
//      /// \brief  for each beta site, the position of that site (if unoccupied) in the list of unoccupied sites
//      std::vector<int> _b_site_to_unocc;
//
//      /// \brief  the site indeces of the occupied alpha sites
//      std::vector<int> _a_occ_to_site;
//
//      /// \brief  the site indeces of the occupied beta sites
//      std::vector<int> _b_occ_to_site;
//
//      /// \brief  the site indeces of the unoccupied alpha sites
//      std::vector<int> _a_unocc_to_site;
//
//      /// \brief  the site indeces of the unoccupied beta sites
//      std::vector<int> _b_unocc_to_site;
//
//    public:
//
//      std::vector<int> & fock_config() { return _fock_config; }
//      const std::vector<int> & fock_config() const { return _fock_config; }
//
//      int & operator[](const int i) { assert( i >= 0 && i < _fock_config.size() ); return _fock_config[i]; }
//      int operator[](const int i) const { assert( i >= 0 && i < _fock_config.size() ); return _fock_config[i]; }
//
//      const std::vector<int> & a_site_to_occ   () const { return _a_site_to_occ;   }
//      const std::vector<int> & b_site_to_occ   () const { return _b_site_to_occ;   }
//      const std::vector<int> & a_site_to_unocc () const { return _a_site_to_unocc; }
//      const std::vector<int> & b_site_to_unocc () const { return _b_site_to_unocc; }
//      const std::vector<int> & a_occ_to_site   () const { return _a_occ_to_site;   }
//      const std::vector<int> & b_occ_to_site   () const { return _b_occ_to_site;   }
//      const std::vector<int> & a_unocc_to_site () const { return _a_unocc_to_site; }
//      const std::vector<int> & b_unocc_to_site () const { return _b_unocc_to_site; }
//
//      Configuration(const formic::InputBase & userinp);
//
//      Configuration & operator=(const Configuration & other);
//
//      int occ_unocc_cmpd(int occ_site, int unocc_site) const;
//
//      template<class GEN> static double propose_move(const formic::InputBase & userinp,
//                                                     GEN & gen,
//                                                     const formic::Configuration & config,
//                                                     formic::ConfigDiff & config_diff);
//
//      void init_occ_unocc_site();
//
//      void update(const formic::ConfigDiff & diff);
//
//  };
//
//  void check_config_update(const formic::ConfigDiff & diff,
//                           const formic::Configuration & config,
//                           const std::string & calling_func);
//
//}

#endif
